home *** CD-ROM | disk | FTP | other *** search
Wrap
// Turbo-vision definitions #define Uses_TApplication #define Uses_TDeskTop #define Uses_TWindow #define Uses_TView #define Uses_TKeys #define Uses_TRect #define Uses_TMenuBar #define Uses_TSubMenu #define Uses_TMenuItem #define Uses_TStatusLine #define Uses_TStatusItem #define Uses_TStatusDef #define Uses_TDialog #define Uses_TStaticText #define Uses_TButton #define Uses_MsgBox #define Uses_TFileDialog #define Uses_TChDirDialog #define Uses_TStreamable #define Uses_fpstream #define Uses_ipstream #include <tv.h> #include <help.h> #include <String.h> #include <Fstream.h> #include <Dir.h> #include "FileView.h" #include <stdio.h> #include <string.h> #include "MMPI.HPP" #include "USER.HPP" #include "MARBLE.H" TVTest::TVTest() : TProgInit( &TVTest::initStatusLine, &TVTest::initMenuBar, &TVTest::initDeskTop ) { TRect r = getExtent(); r.a.x = r.b.x - 9; r.b.y = r.a.y + 1; clock = new TClockView( r ); insert(clock); titleWin(); } TVTest::~TVTest() { delete clock; } // Is a window tileable?? static Boolean isTileable(TView *p, void * ) { if( (p->options & ofTileable) != 0) return True; else return False; } void TVTest::idle() { TProgram::idle(); clock->update(); if (deskTop->firstThat(isTileable, 0) != 0 ) { enableCommand(cmTile); enableCommand(cmCascade); } else { disableCommand(cmTile); disableCommand(cmCascade); } if (theTest.isEmpty()) { disableCommand(cmSaveTest); disableCommand(cmReportTest); } else { enableCommand(cmSaveTest); enableCommand(cmReportTest); } } TStatusLine *TVTest::initStatusLine(TRect r) { r.a.y = r.b.y - 1; // move top to 1 line above bottom return new TStatusLine( r, *new TStatusDef( 0, 0xFFFF ) + // set range of help contexts *new TStatusItem( 0, kbF10, cmMenu ) + *new TStatusItem( "~Alt-X~ Exit", kbAltX, cmQuit ) + *new TStatusItem( "~F1~ Help", kbF1, cmHelp ) + *new TStatusItem( "~Alt-F3~ Close", kbAltF3, cmClose ) + *new TStatusItem( "~F9~ Take Test", kbF9, cmTakeTest ) ); } TMenuBar *TVTest::initMenuBar( TRect r ) { r.b.y = r.a.y + 1; // set bottom line 1 line below top line return new TMenuBar( r, *new TSubMenu( "~H~elp", kbAltH )+ *new TMenuItem( "The Marble Counter", cmCopyrights, kbNoKey, hcNoContext, "" )+ *new TMenuItem( "The MMPI", cmTheTest, kbNoKey, hcNoContext, "" )+ *new TMenuItem( "The Psychotic Menace",cmTheMenace, kbNoKey, hcNoContext, "" )+ *new TMenuItem( "To The Paranoid", cmForTheParanoid,kbNoKey, hcNoContext, "" )+ newLine()+ *new TMenuItem( "Q - Question", cmWhatIs_Q, kbNoKey, hcNoContext,"")+ *new TMenuItem( "F - Validity", cmWhatIs_F, kbNoKey, hcNoContext,"")+ *new TMenuItem( "K - Correction", cmWhatIs_K, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Hs - Hypochondriasis",cmWhatIs_Hs, kbNoKey, hcNoContext,"")+ *new TMenuItem( "D - Depression", cmWhatIs_D, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Hy - Hysteria", cmWhatIs_Hy, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Pd - Psychopathic deviant", cmWhatIs_Pd, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Mf - Masculinity/Femininity", cmWhatIs_MfM, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Pa - Paranoia", cmWhatIs_Pa, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Pt - Psychasthenia", cmWhatIs_Pt, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Sc - Schizophrenia", cmWhatIs_Sc, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Ma - Hypomania", cmWhatIs_Ma, kbNoKey, hcNoContext,"")+ *new TMenuItem( "Si - Social Introversion", cmWhatIs_Si, kbNoKey, hcNoContext,"")+ *new TMenuItem( "L - Lie", cmWhatIs_L, kbNoKey, hcNoContext,"")+ *new TSubMenu( "~F~ile", kbAltF )+ *new TMenuItem( "~C~hange Directory", cmChangeDir, kbNoKey, hcNoContext, "" )+ *new TMenuItem( "~L~oad Test", cmLoadTest, kbF3, hcNoContext, "F3" )+ *new TMenuItem( "~S~ave Test", cmSaveTest, kbF4, hcNoContext, "F4" )+ *new TMenuItem( "~R~eport Test", cmReportTest, kbF6,hcNoContext, "F2" )+ newLine()+ *new TMenuItem( "E~x~it", cmQuit, kbAltX, hcNoContext, "Alt-X" )+ *new TSubMenu( "~T~est", kbAltT )+ *new TMenuItem( "~T~ake Test", cmTakeTest, kbF9, hcNoContext, "F9" )+ *new TMenuItem( "~P~ractice Test",cmCheatTest,kbAltF9, hcNoContext, "Alt-F9" )+ *new TSubMenu( "~W~indows", 0, hcNoContext ) + *new TMenuItem( "~R~esize/move", cmResize, kbCtrlF5, hcNoContext, "Ctrl-F5" ) + *new TMenuItem( "~Z~oom", cmZoom, kbF5, hcNoContext, "F5" ) + *new TMenuItem( "~N~ext", cmNext, kbF6, hcNoContext, "F6" ) + *new TMenuItem( "~C~lose", cmClose, kbAltF3, hcNoContext, "Alt-F3" ) + *new TMenuItem( "~T~ile", cmTile, kbNoKey, hcNoContext ) + *new TMenuItem( "C~a~scade", cmCascade, kbNoKey, hcNoContext ) ); } void TVTest::handleEvent( TEvent& event ) { TApplication::handleEvent( event ); if( event.what == evCommand ) { switch( event.message.command ) { case cmChangeDir: changeDir(); clearEvent(event); break; case cmLoadTest: loadAnswers(); clearEvent(event); break; case cmSaveTest: saveAnswers(); clearEvent(event); break; case cmReportTest: reportTest(); clearEvent(event); break; case cmTakeTest: TakeTest(0); clearEvent(event); break; case cmCheatTest: TakeTest(1); clearEvent(event); break; case cmTile: deskTop->tile( deskTop->getExtent() ); break; case cmCascade: deskTop->cascade( deskTop->getExtent() ); break; case cmHelp: HelpMe(event, getHelpCtx()); break; case cmWhatIs_Q: HelpMe(event, hcWhatIs_Q); break; case cmWhatIs_F: HelpMe(event, hcWhatIs_F); break; case cmWhatIs_K: HelpMe(event, hcWhatIs_K); break; case cmWhatIs_Hs: HelpMe(event, hcWhatIs_Hs); break; case cmWhatIs_D: HelpMe(event, hcWhatIs_D); break; case cmWhatIs_Hy: HelpMe(event, hcWhatIs_Hy); break; case cmWhatIs_Pd: HelpMe(event, hcWhatIs_Pd); break; case cmWhatIs_MfM: HelpMe(event, hcWhatIs_Mf); break; case cmWhatIs_Pa: HelpMe(event, hcWhatIs_Pa); break; case cmWhatIs_Pt: HelpMe(event, hcWhatIs_Pt); break; case cmWhatIs_Sc: HelpMe(event, hcWhatIs_Sc); break; case cmWhatIs_Ma: HelpMe(event, hcWhatIs_Ma); break; case cmWhatIs_Si: HelpMe(event, hcWhatIs_Si); break; case cmWhatIs_L: HelpMe(event, hcWhatIs_L); break; case cmCopyrights: HelpMe(event, hcNocontext); break; case cmTheTest: HelpMe(event, hcMMPI); break; case cmTheMenace: HelpMe(event, hcTheMenace); break; case cmForTheParanoid: HelpMe(event, hcParanoidPeople); break; default: break; } } } void TVTest::changeDir() { TView *d = validView( new TChDirDialog( 0, cmChangeDir ) ); if( d != 0 ) { deskTop->execView( d ); destroy( d ); } } // Read void TVTest::loadAnswers() { if( !theTest.isEmpty() && (messageBox("The test already in RAM will be lost. Continue?", mfInformation | mfYesButton | mfNoButton ) != cmYes) ) return; TFileDialog *d= (TFileDialog *)validView( new TFileDialog( "*.ANS", "Load Test Answers", "~N~ame", fdOpenButton, 100 )); if( d != 0 && deskTop->execView( d ) != cmCancel ) { char fileName[MAXPATH]; d->getFileName( fileName ); if(theTest.loadAnswers(fileName)) { if(theTest.isNotComplete()) TakeTest(0); else if(theTest.ResultForm()) showTest(); } else messageBox( "Could not read ANSwer file.", mfError | mfOKButton ); } destroy( d ); } void TVTest::saveAnswers() { TFileDialog *d= (TFileDialog *)validView( new TFileDialog( "*.ANS", "Save Test Answers", "~N~ame", fdOKButton, 100 )); if( d != 0 && deskTop->execView( d ) != cmCancel ) { char fileName[MAXPATH]; d->getFileName( fileName ); if(!theTest.saveAnswers(fileName)) messageBox( "Could not write ANSwer file.", mfError | mfOKButton ); } destroy( d ); } // Run through the test questions void TVTest::TakeTest(int CHEAT) { MMPIQuestion *current; int answer; if(theTest.isEmpty()) { theTest.clearAnswers(); current = theTest.first(); } else { // Find the first unanswered question current = theTest.isNotComplete(); if( current ) { if(messageBox("There is a partial test in RAM.\nResume this test?", mfInformation | mfYesButton | mfNoButton ) == cmYes ) current = theTest.current(); else { theTest.clearAnswers(); current = theTest.first(); } } else { if(messageBox("The test already in RAM will be lost. Continue?", mfInformation | mfYesButton | mfNoButton ) == cmYes ) { theTest.clearAnswers(); current = theTest.first(); } else return; } } if( !theTest.gender ) switch(GetGender()) { case cmYes: theTest.gender=MALE; break; case cmNo: theTest.gender=FEMALE; break; default: return; }; if(current) { do { answer = ask(current,CHEAT); switch(answer) { case cmCancel: switch(abortTest()) { case cmNo: if( !(current=theTest.prev()) ) current=theTest.first(); break; case cmYes: if( !theTest.isEmpty() && (messageBox( "You may resume this test by saving it now, then loading it at another time.\n\3Save it now?", mfInformation | mfYesButton | mfNoButton ) == cmYes) ) saveAnswers(); return; default: break; } break; case cmYes: current->response = 'T'; current=theTest.next(); break; case cmNo: current->response = 'F'; current=theTest.next(); break; } } while(current); theTest.saveAnswers("BACKUP.ANS"); if(theTest.ResultForm()) showTest(); } } // Put up an ABORT dialog int TVTest::GetGender() { TDialog dial(TRect(0,0,25,9), "Subject Gender" ); dial.options|= (ofCenterX | ofCenterY); TButton *nb; nb=new TButton( TRect( 0, 5, 15, 7 ), "FEMALE", cmYes, bfNormal ); nb->options|= ofCenterX; dial.insert(nb); nb=new TButton( TRect( 0, 2, 15, 4 ), "MALE", cmNo,bfNormal ); nb->options|= ofCenterX; dial.insert(nb); return(deskTop->execView( &dial )); } // Put up an ABORT dialog int TVTest::abortTest() { TDialog dial(TRect(0,0,25,11), "Test Options" ); dial.options|= (ofCenterX | ofCenterY); TButton *nb; nb=new TButton( TRect( 0, 2, 15, 4 ), "Back Up", cmNo,bfNormal ); nb->options|= ofCenterX; dial.insert(nb); nb=new TButton( TRect( 0, 5, 15, 7 ), "Stop Test", cmYes, bfNormal ); nb->options|= ofCenterX; dial.insert(nb); nb=new TButton( TRect( 0, 8, 15, 10 ), "Continue", cmCancel, bfNormal ); nb->options|= ofCenterX; dial.insert(nb); return(deskTop->execView( &dial )); } // Put up a question dialog int TVTest::ask(MMPIQuestion *q, int CHEAT) { static char scales[128]; static char scaleFormat[16]; int c; char scale; TDialog dial(TRect( 0, 0, 70, 11), "MMPI Form R" ); dial.options|= (ofCenterX | ofCenterY); if(CHEAT) { strcpy(scales, "Scales: "); for(c=0;c<NUM_SCALES;++c) { scale = q->getScale(c); if(scale != ' ') { sprintf(scaleFormat, "%s=%s ", aScale[c], (scale=='T')?"TRUE":"FALSE"); strcat(scales,scaleFormat); } } dial.insert( new TStaticText( TRect( 5, 1, 65, 2 ), scales ) ); } TButton *bTrue; TButton *bFalse; TStaticText *textI; textI = new TStaticText( TRect( 5, 2, 65, 5 ), q->text ); bTrue = new TButton( TRect( 5, 6, 30, 10 ), "~T~RUE", cmYes, bfNormal ); bFalse = new TButton( TRect( 40, 6, 65, 10 ), "~F~ALSE", cmNo, bfNormal ); dial.insert(textI); if(q->response == 'F') { dial.insert(bTrue); dial.insert(bFalse); } else { dial.insert(bFalse); dial.insert(bTrue); } return(deskTop->execView( &dial )); } void TVTest::titleWin() { messageBox( "\3The Minnesota Marble Counter 1.1\n\n\3The Psychotic Menace\n \n\3April 1, 1992", mfInformation | mfOKButton ); } void TVTest::HelpMe(TEvent& event, int how) { TWindow *w; THelpFile *hFile; fpstream *helpStrm; static int helpInUse = False; clearEvent(event); if(!helpInUse) { helpInUse = True; helpStrm = new fpstream("MARBLE.HLP", ios::in|ios::binary); hFile = new THelpFile(*helpStrm); if (!helpStrm) { messageBox("Could not open MARBLE.HLP", mfError | mfOKButton); delete hFile; } else { w = new THelpWindow(hFile, how); if (validView(w) != 0) { execView( w ); destroy( w ); } else delete w; } helpInUse = False; } } void TVTest::reportTest() { TFileDialog *d= (TFileDialog *)validView( new TFileDialog( "*.RPT", "Report Test Results", "~N~ame", fdOKButton, 100 )); if( d != 0 && deskTop->execView( d ) != cmCancel ) { char fileName[MAXPATH]; d->getFileName( fileName ); if(!theTest.ResultForm(fileName)) messageBox( "Could not write Report.", mfError | mfOKButton ); } destroy( d ); } // Display a test result file void TVTest::showTest(char *fName) { TView *vWin= validView( new TFileWindow( fName ) ); if( vWin != 0 ) deskTop->insert(vWin); } // // -------------- Clock Viewer functions // TClockView::TClockView( TRect& r ) : TView( r ) { strcpy(lastTime, " "); strcpy(curTime, " "); } void TClockView::draw() { TDrawBuffer buf; char c = getColor(2); buf.moveChar(0, ' ', c, size.x); buf.moveStr(0, curTime, c); writeLine(0, 0, size.x, 1, buf); } void TClockView::update() { time_t t = time(0); char *date = ctime(&t); date[19] = '\0'; strcpy(curTime, &date[11]); /* Extract time. */ if( strcmp(lastTime, curTime) ) { drawView(); strcpy(lastTime, curTime); } } // Ah, what a fine spot to put main void main() { TVTest test; if(test.theTest.size < 1) messageBox( "FATAL:\n \n Could not read TEST.DAT!", mfError | mfOKButton ); else test.run(); }